package org.fujay.langchain4jserver.domain.conversation.repository;

import org.fujay.langchain4jserver.domain.application.vo.AppId;
import org.fujay.langchain4jserver.domain.conversation.aggregate.ConversationAggregate;
import org.fujay.langchain4jserver.domain.conversation.vo.ConversationId;
import org.fujay.langchain4jserver.domain.conversation.vo.UserId;

import java.util.List;
import java.util.Optional;

/**
 * 会话仓储接口
 */
public interface ConversationRepository {

    /**
     * 保存会话聚合根（包含其消息）
     *
     * @param aggregate 会话聚合根
     */
    void save(ConversationAggregate aggregate);

    /**
     * 根据ID查找会话聚合根（包含消息）
     *
     * @param id 会话ID
     * @return 会话聚合根 Optional
     */
    Optional<ConversationAggregate> findById(ConversationId id);

    /**
     * 根据用户ID和应用ID查找会话列表（通常只加载会话基本信息，不加载消息）
     *
     * @param userId 用户ID
     * @param appId  应用ID (可选，为null则查询用户所有应用的会话)
     * @return 会话聚合根列表 (不完整的聚合)
     */
    List<ConversationAggregate> findByUserAndApp(UserId userId, AppId appId);

    /**
     * 根据ID删除会话（包含其消息）
     *
     * @param id 会话ID
     */
    void deleteById(ConversationId id);

    boolean hasActiveConversations(AppId appId);

    // 可选：如果需要单独操作消息
    // void saveMessage(Message message, ConversationId conversationId);
    // List<Message> findMessagesByConversationId(ConversationId id);
}
